应用模具应用至 3D 内容

使用渲染通道和模具缓冲区将模具应用到 3D 内容,使 Kanzi 仅渲染内容的选定区域。

模具缓冲区是当前帧缓冲区中的图像,您可以用当前帧缓冲区来控制 Kanzi 渲染哪些像素。您根据模具缓冲区的值使用渲染通道放弃或渲染内容中的特定像素。通过这种方式,您可以将渲染区域限制为您用作模具的节点形状。节点形状用作模具中的间隙,确定内容中哪些部分是可见的。

要将模具应用至 3D 内容并仅渲染模板定义的区域:

  1. 创建您要用作模具的节点。
    例如:
    1. 导入您要将其形状用作模具的网格。请参阅使用网格
    2. 创建Model 节点,命名为 Stencil,并在属性 (Properties) 中设置网格 (Mesh) 属性为导入的网格。
  2. 创建您要对其应用模具的 3D 节点。
    例如,创建一个显示联系人列表的 3D 网格列表框 (Grid List Box 3D) 节点。
  3. 缩放并定位您创建的节点,以便您要用作模具的节点画出区域,在其中显示您要应用模具的节点。
  4. 标记您要用作模具的节点。请参阅标记节点
    例如,使用Stencil 标签标记Stencil 节点。
  5. 创建标签过滤器 (Tag Filter) 资源,选取Stencil 节点,创建另一个标签过滤器 (Tag Filter) 资源,选取除Stencil 节点之外的所有节点。请参阅使用标签过滤器 (Tag Filter)
    例如,创建以下 标签过滤器 (Tag Filter) 资源:
  6. 应用模具:
    1. 素材库 (Library) > 渲染 (Rendering)按下 Alt 并右键点击渲染通道 (Render Passes),选择组渲染通道 (Group Render Pass) 并命名为 Stencil Render Pass
      使用组渲染通道 (Group Render Pass) 收集应用模具到内容的渲染通道。
    2. 素材库 (Library) > 渲染 (Rendering) > 渲染通道 (Render Passes) > Stencil Render Pass 中创建 清除渲染通道 (Clear Render Pass),在属性 (Properties) 中添加清除模具 (Clear Stencil) 属性,将其设为 0。
      这样可以在模具缓冲区中将 0 值写入所有像素,从而清除模具缓冲区。
      您将在这个过程的后续步骤中使用模具缓冲区将渲染区域限制为Stencil 节点的形状。
    3. 工程 (Project) 中,选择包含Stencil 节点的场景 (Scene) 节点及您要应用模具的节点,并在属性 (Properties) 中将渲染通道 (Render Pass) 属性设为Stencil Render Pass
      通过这种方式,您可以设置 Kanzi 来使用Stencil Render Pass 渲染场景 (Scene) 节点。
      Stencil Render Pass 没有在屏幕上绘制。
    4. 向模具缓冲区写入Stencil 节点的形状:
      1. 素材库 (Library) > 渲染 (Rendering) > 渲染通道 (Render Passes) > Stencil Render Pass 中创建绘图对象渲染通道 (Draw Objects Render Pass),将其命名为 Draw Stencil,在属性 (Properties) 中添加对象源 (Object Source) 属性,并将其设置为Stencil Filter 标签过滤器 (Tag Filter)
        使用对象源 (Object Source) 属性将要渲染的节点传递至绘图对象渲染通道 (Draw Objects Render Pass)
        在这里设置 Stencil Render Pass 只渲染 Stencil 节点。

      2. 素材库 (Library) > 渲染 (Rendering) > 渲染通道 (Render Passes) > Stencil Render Pass 中创建管道状态渲染通道 (Pipeline State Render Pass),命名为Stencil Write,并将Draw Stencil 渲染通道拖到Stencil Write 渲染通道。
        使用渲染通道写入至模具缓冲区。
      3. 素材库 (Library) > 渲染 (Rendering) > 渲染通道 (Render Passes) > Stencil Render Pass 中选择Stencil Write,在属性 (Properties) 中添加并设置:
        • 颜色写入模式 (Color Write Mode)无 (None)
          通过这种方式,让Stencil 节点不可见。
        • 模具测试函数 (Stencil Test Function)始终 (Always)
          您使用此属性控制模具测试以何种方式将模具参考值与模具缓冲区中的值进行比较。将属性设为始终 (Always),以始终通过测试。
          通过这种方式,使Draw Stencil 渲染通道将Stencil 节点写入模具缓冲区。
          请参阅模具测试函数
        • 模具函数参考值 (Stencil Function Reference Value) 为 1
          通过将模具函数参考值 (Stencil Function Reference Value) 设为 1,使Draw Stencil 渲染通道将值 1 写入模具缓冲区。
        • 模具通道深度通道操作 (Stencil Pass Depth Pass Operation)替换 (Replace)
          使用 模具函数参考值 (Stencil Function Reference Value) 属性的值替换模具缓冲区中的当前值。
          请参阅模具操作
        • 模具写入已启用 (Stencil Write Enabled) 为启用
          将值为 1 的 Stencil 节点形状写入模具缓冲区,其他区域的“0”保持不变。
  7. 渲染要应用模具的节点。
    例如:
    1. 素材库 (Library) > 渲染 (Rendering) > 渲染通道 (Render Passes) > Stencil Render Pass 中创建绘图对象渲染通道 (Draw Objects Render Pass),将其命名为 Draw ContactsList,在属性 (Properties) 中添加对象源 (Object Source) 属性,并将其设置为Content Filter标签过滤器 (Tag Filter)
      Kanzi 现在渲染场景 (Scene) 中的所有节点,Stencil 节点除外。Kanzi 未渲染Stencil 节点,因为Content Filter 排除了带有Stencil 标签的节点。

    2. 素材库 (Library) > 渲染 (Rendering) > 渲染通道 (Render Passes) > Stencil Render Pass 中创建管道状态渲染通道 (Pipeline State Render Pass),命名为Stencil Test,并将Draw ContactsList 渲染通道拖到Stencil Test 渲染通道。
      在下一步骤中,使用Stencil Test 渲染通道将Draw ContactsList 渲染通道的渲染限制为您在这个过程的前面步骤中写入模具缓冲区的区域。
    3. 素材库 (Library) > 渲染 (Rendering) > 渲染通道 (Render Passes) > Stencil Render Pass 中选择Stencil Test,在属性 (Properties) 中添加并设置:
      • 模具测试函数 (Stencil Test Function)等于 (Equal)
      • 模具函数参考值 (Stencil Function Reference Value) 为 1
      通过这种方式,您将ContactsList 节点的渲染区域限制为模具值为 1 的像素,因此渲染通道仅绘制Stencil 节点与ContactsList 节点重叠的部分。

模具测试函数

使用模具测试函数 (Stencil Test Function) 属性将模具函数参考值 (Stencil Function Reference Value) 与模具缓冲区中的值进行比较。

您可以使用以下操作:

模具测试函数 (Stencil Test Function) 描述 (Description)
始终 (Always) 总是传递
等于 (Equal) 如果值相等则传递
Greater 如果模具函数参考值 (Stencil Function Reference Value) 大于模具缓冲区中的值则传递
Greater or Equal 如果模具函数参考值 (Stencil Function Reference Value) 大于或等于模具缓冲区中的值则传递
Less 如果模具函数参考值 (Stencil Function Reference Value) 小于模具缓冲区中的值则传递
Less or Equal 如果模具函数参考值 (Stencil Function Reference Value) 小于或等于模具缓冲区中的值则传递
Never 总是失败
不等于 (Not equal) 如果模具函数参考值 (Stencil Function Reference Value) 不同于模具缓冲区中的值则传递
   

使用模具测试函数 (Stencil Test Function) 比较模具函数参考值 (Stencil Function Reference Value) 和模具缓冲区中的值时,您可以使用模具函数遮罩 (Stencil Function Mask) 属性对它们执行按位 AND 操作。这样,您只能修改模具缓冲区中的特定位。默认情况下,将 模具函数遮罩 (Stencil Function Mask) 设为 255 时,所有 模具测试函数 (Stencil Test Function) 操作会对缓冲中的所有位执行读写操作。
例如,如果将模具函数遮罩 (Stencil Function Mask) 设为 2,Kanzi Studio 只保留模具引用值的第二位和模具缓冲区值。这样,您可以使用模具缓冲区的不同位数来遮罩屏幕上的不同元素。

模具操作

使用 模具失败操作 (Stencil Fail Operation)模具通道深度失败操作 (Stencil Pass Depth Fail Operation)模具通道深度通道操作 (Stencil Pass Depth Pass Operation) 属性设置模具缓冲区中的值,具体取决于模具和深度测试的结果。默认情况下,Kanzi Studio 保留当前值。

您可以使用以下操作:

操作 (Operation) 描述 (Description)
Decrease 如果模具值大于 0,则减去 1。
Decrease wrap 否则与 Decrease 相同,但如果当前值为 0,则将该值设为模具缓冲区的最大可能值,通常为 255。
Increase 如果模具值小于最大值,则增加 1。
Increase wrap 否则与 Increase 相同,但如果超出最大值,则将该值设为 0。
Invert 向该值应用按位反转。
Keep 保留当前值。
替换 (Replace) 使用模具函数参考值 (Stencil Function Reference Value) 属性的值替换模具值。
Zero 将模具值设为 0。
   

另请参阅

渲染

教程:应用模具至 3D 内容

使用标签

使用标签过滤器 (Tag Filter)

使用网格